package demo.main;

import static net.sf.dynamicreports.report.builder.DynamicReports.cht;
import static net.sf.dynamicreports.report.builder.DynamicReports.field;
import static net.sf.dynamicreports.report.builder.DynamicReports.report;
import static net.sf.dynamicreports.report.builder.DynamicReports.type;

import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.dynamicreports.report.base.expression.AbstractSimpleExpression;
import net.sf.dynamicreports.report.builder.FieldBuilder;
import net.sf.dynamicreports.report.builder.chart.BarChartBuilder;
import net.sf.dynamicreports.report.builder.chart.CategoryChartSerieBuilder;
import net.sf.dynamicreports.report.builder.chart.LineChartBuilder;
import net.sf.dynamicreports.report.constant.AxisPosition;
import net.sf.dynamicreports.report.definition.ReportParameters;
import net.sf.dynamicreports.report.exception.DRException;
import net.sf.jasperreports.engine.JRDataSource;

import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;

public class MutiAxisChar extends MutiReport {
	@At("/getMutiAxisChar")
	@Ok("json")
	public String getMutiAxisChar(HttpServletRequest request,
			HttpServletResponse response) {
		System.out.println("getMutiAxisChar");
		build(request, response);
		return resultResult;
	}

	protected void build(HttpServletRequest request,
			HttpServletResponse response) {
		FieldBuilder<Date> dateField = field("date", type.dateType());
		FieldBuilder<Integer> stock1Field = field("stock1", type.integerType());
		FieldBuilder<Integer> stock2Field = field("stock2", type.integerType());

		CategoryChartSerieBuilder stock1Serie = cht.serie(stock1Field)
				.setLabel("股1");
		CategoryChartSerieBuilder stock2Serie = cht.serie(stock2Field)
				.setLabel("股2");

		LineChartBuilder chart1 = cht.lineChart()
				.setCategory(new CategoryExpression()).series(stock1Serie)
				.setValueAxisFormat(cht.axisFormat().setLabel("股1"));

		BarChartBuilder chart2 = cht.barChart()
				.setCategory(new CategoryExpression()).series(stock2Serie)
				.setValueAxisFormat(cht.axisFormat().setLabel("股2"));

		try {
			reportBuilder = report()
					.setTemplate(Templates.reportTemplate)
					.fields(dateField)
					.title(Templates.createTitleComponent(""),
							cht.multiAxisChart(chart1, chart2),
							cht.multiAxisChart()
									.addChart(chart1, AxisPosition.LEFT_OR_TOP)
									.addChart(chart2,
											AxisPosition.RIGHT_OR_BOTTOM))
					.pageFooter(Templates.footerComponent)
					.setDataSource(createDataSource());
			setResult(reportBuilder.toJasperPrint(), request, response);
		} catch (DRException e) {
			e.printStackTrace();
		}
	}

	private JRDataSource createDataSource() {
		DataSource dataSource = new DataSource("date", "stock1", "stock2");
		dataSource.add(toDate(2010, 1), 25, 300);
		dataSource.add(toDate(2010, 2), 11, 450);
		dataSource.add(toDate(2010, 3), 17, 280);
		dataSource.add(toDate(2010, 4), 15, 620);
		dataSource.add(toDate(2010, 5), 30, 400);
		dataSource.add(toDate(2010, 6), 8, 320);
		dataSource.add(toDate(2010, 7), 25, 490);
		return dataSource;
	}

	private Date toDate(int year, int month) {
		Calendar c = Calendar.getInstance();
		c.clear();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month - 1);
		return c.getTime();
	}

	private class CategoryExpression extends AbstractSimpleExpression<String> {
		private static final long serialVersionUID = 1L;

		public String evaluate(ReportParameters reportParameters) {
			return type.dateYearToMonthType().valueToString("date",
					reportParameters);
		}
	}

}
